package com.itheima.controller;

import com.itheima.anno.Log;
import com.itheima.pojo.*;
import com.itheima.service.ClazzService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDate;
import java.util.List;

@Slf4j
@RequestMapping("/clazzs")
@RestController
public class ClazzController {

    @Autowired
    private ClazzService clazzService;

    // 分页查询班级
    // 使用一个实体类ClazzQueryParam来接受查询的所有参数,方便更改参数
    // 由于只能返回一个对象,需要返回两个数据,所以将两个数据封装在PageResult中变成一个对象,存入统一返回结果进行返回
    @GetMapping
    public Result page(ClazzQueryParam clazzQueryParam) {
        log.info("分页查询:{}",clazzQueryParam);
        PageResult<Clazz> pageResult = clazzService.page(clazzQueryParam);
        return Result.success(pageResult);
    }

    // 删除班级
    // 由于前端传入的参数是路径参数,所以需要注解@PathVariable为形参id绑定路径参数名{id},完成映射
    @Log
    @DeleteMapping("/{id}")
    public Result deleteById(@PathVariable("id") Integer id) {
        log.info("删除id为{}的班级", id);
        boolean state = clazzService.deleteById(id);
        if (!state) {
            log.info("id为{}的班级还有学员,不能删除", id);
            return Result.error("当前班级下还有学员,不能删除");
        }
        return Result.success();
    }

    // 查询展示所有班级
    @GetMapping("/list")
    public Result listAll() {
        log.info("展示了所有的班级");
        return Result.success(clazzService.listAll());
    }

    // 根据JSON中的班级信息修改对应id的班级
    // 由于前端传过来的是个JSON格式,无法直接将其存入Clazz类对象中,所以使用@RequestBody对数据进行转换
    // JSON中键名与类中成员变量名相同时,会将值传入类中的成员变量
    @Log
    @PutMapping
    public Result update(@RequestBody Clazz clazz) {
        log.info("修改了班级为{}", clazz);
        clazzService.update(clazz);
        return Result.success();
    }

    // 根据路径id查询班级信息
    // 由于前端传入的参数是路径参数,所以需要注解@PathVariable为形参id绑定路径参数名{id},完成映射
    @GetMapping("/{id}")
    public Result findById(@PathVariable("id") Integer id) {
        log.info("查询id为{}的班级", id);
        return Result.success(clazzService.findById(id));
    }

    // 添加班级信息
    // 由于前端传过来的是个JSON格式,无法直接将其存入Clazz类对象中,所以使用@RequestBody对数据进行转换
    // JSON中键名与类中成员变量名相同时,会将值传入类中的成员变量
    @Log
    @PostMapping
    public Result insert(@RequestBody Clazz clazz) {
        log.info("添加了班级{}", clazz);
        clazzService.insert(clazz);
        return Result.success();
    }

}
